package hr.fer.zpr.nmbp.project1.bll;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import hr.fer.zpr.nmbp.project1.bll.exceptions.BLLException;
import hr.fer.zpr.nmbp.project1.dao.DAOFactory;
import hr.fer.zpr.nmbp.project1.dao.DijagnozaDAO;
import hr.fer.zpr.nmbp.project1.dao.exceptions.DAOException;
import hr.fer.zpr.nmbp.project1.model.Bolest;
import hr.fer.zpr.nmbp.project1.model.Dijagnoza;
import hr.fer.zpr.nmbp.project1.model.Karton;
import hr.fer.zpr.nmbp.project1.model.Pacijent;
import java.util.Date;

public class DijagnozaBLL {

	private DijagnozaDAO dijagnozaDAO = DAOFactory.getDijagnozaDAO();

	public void save(Dijagnoza dijagnoza) {
		if(!isValidDijagnoza(dijagnoza)){
			throw new BLLException("Sva polja moraju biti popunjena");
		}

		dijagnoza.setSifra(UUID.randomUUID().toString());
		if(!dijagnoza.getKarton().getDijagnoze().contains(dijagnoza)){
			dijagnoza.getKarton().getDijagnoze().add(dijagnoza);
		}
		
		try {
			dijagnozaDAO.save(dijagnoza);
		} catch (DAOException ex) {
			throw new BLLException(ex.getMessage());
		}
	}

	public void update(Dijagnoza dijagnoza){
		if(!isValidDijagnoza(dijagnoza)){
			throw new BLLException("Sva polja moraju biti popunjena");
		}
		
		Dijagnoza proto = new Dijagnoza();
    	proto.setSifra(dijagnoza.getSifra());
    	List<Dijagnoza> dijagnozeFromDB = this.dijagnozaDAO.load(proto);
    	
    	Dijagnoza persistentDijagnoza;
    	if(dijagnozeFromDB.size() > 0){
    		persistentDijagnoza = dijagnozeFromDB.get(0);
    		persistentDijagnoza.setDatum(dijagnoza.getDatum());
    		persistentDijagnoza.setKarton(dijagnoza.getKarton());
    		persistentDijagnoza.setOpis(dijagnoza.getOpis());
    		
    		persistentDijagnoza.getBolesti().clear();
    		for(Bolest bolest : dijagnoza.getBolesti()){
    			persistentDijagnoza.getBolesti().add(bolest);
    		}
    		
    		if(!persistentDijagnoza.getKarton().getDijagnoze().contains(persistentDijagnoza)){
    			persistentDijagnoza.getKarton().getDijagnoze().add(persistentDijagnoza);
    		}
    	}else{
    		throw new BLLException("Nepostojeća dijagnoza u bazi podataka");
    	}
		
    	try {
			dijagnozaDAO.save(persistentDijagnoza);
		} catch (DAOException ex) {
			throw new BLLException(ex.getMessage());
		}
	}
	
	public void delete(Dijagnoza dijagnoza) {
		dijagnozaDAO.delete(dijagnoza);
	}
	
	public static boolean isValidDijagnoza(Dijagnoza dijagnoza){
		if (dijagnoza == null 
				|| dijagnoza.getDatum() == null
				|| dijagnoza.getOpis() == null
				|| dijagnoza.getOpis().isEmpty()) {
			return false;
		}else{		
			return true;
		}
	}
	
	public List<Dijagnoza> loadAll(){
		return this.dijagnozaDAO.loadAll();
	}
    
    public List<Dijagnoza> load(Pacijent pacijent) {
    	Karton karton = pacijent.getKarton();    	
    	if(karton != null){
    		Dijagnoza proto = new Dijagnoza();
    		proto.setKarton(karton);
    		return this.dijagnozaDAO.load(proto);
    	}else{
    		return new ArrayList<Dijagnoza>();
    	}
    }
    
    public List<Dijagnoza> load(Date datumOd, Date datumDo) {
        return this.dijagnozaDAO.load(datumOd, datumDo);
    }
    
    public List<Dijagnoza> load(List<Bolest> bolesti) {
        return this.dijagnozaDAO.load(bolesti);
    }
}
